|
|
LCD a matrice di punti compatibile HD44780
Per la visualizzazione dei dati ricevuti via radio, il ricevitore
dispone di un visualizzatore a matrice di punti a cristalli liquidi da
2 righe e 16 caratteri per riga, al quale vengono inviati i dati dopo
essere stati elaborati ed interpretati dalla circuiteria analogica e
dal PIC. Siccome il PIC ricevitore utilizza solo le linee RA per le
comunicazioni con la sezione analogica, le linee RB vengono utilizzate
allora per comunicare con l'LCD con un bus dati a 8bit. Infatti questo
modulo LCD può accettare dati anche in formato a 4bit, con le modalità
descritte di seguito. Ciò semplifica di molto la scrittura del codice
per il PIC permettendo di dedicare più spazio ad altre routine.
Il visualizzatore è, in realtà, solo la parte più appariscente di un
modulo LCD e, spesso, si tende a confondere il primo con il secondo. Di
certo il display LCD è assolutamente inutile senza un circuito
elettronico in grado di gestirlo e, dato l'oneroso compito a cui è
chiamato, sembra improbabile solo pensare a realizzarlo con componenti
discreti. Per questo il mercato offre strutture integrate (moduli)
dotate di tutto ciò che serve, montato su un circuito stampato; da un
lato è saldato il display e sul lato opposto sono presenti numerosi
componenti, tra cui circuiti integrati. Certamente il più importante
tra questi è il controller, un componente programmabile con una duplice
funzione:
- dispone della struttura necessaria per
gestire fino a 50 (10 * 5) pixel per ciascuno dei possibili caratteri
alfanumerici del display, organizzati su una o più righe;
- assicura l' interfaccia intelligente tra il visualizzatore e il processore o il microcontrollore chiamato a gestirlo.
Il controller di gran lunga più diffuso ed utilizzato sul mercato è
senz'altro il controller HD44780 della Hitachi, quasi uno standard per
questi oggetti. Questa sezione si occupa appunto di descrivere la
struttura, il funzionamento e l'utilizzo di questo controller.
Piedinatura del modulo LCD
| N. Pin |
Nome |
I/O |
Descrizione |
| 1 |
Vss |
Power |
Massa |
| 2 |
Vcc |
Power |
+5V |
| 3 |
Vo |
Analog |
Regolazione contrasto |
| 4 |
RS |
Input |
Selezione dati/istruzioni |
| 5 |
R/W |
Input |
Read/Write |
| 6 |
E |
Input |
Abilitazione |
| 7 |
D0 |
I/O |
Dati LSB |
| 8 |
D1 |
I/O |
Dati |
| 9 |
D2 |
I/O |
Dati |
| 10 |
D3 |
I/O |
Dati |
| 11 |
D4 |
I/O |
Dati |
| 12 |
D5 |
I/O |
Dati |
| 13 |
D6 |
I/O |
Dati |
| 14 |
D7 |
I/O |
Dati MSB |
| 15 |
A |
Power |
Retroilluminazione (+) |
| 16 |
K |
Power |
Retroilluminazione (GND) |
|
|
Tab.1 - Assegnazione Pin
|
I pin 1 (Vss) e 2 (Vcc) servono per fornire alimentazione (5 volt); di
solito l'assorbimento è contenuto, dell'ordine di pochi mA.
Il pin 3 (Vo) è un ingresso analogico al quale si deve fornire una
tensione compresa tra 0 e 5V al fine di regolare il contrasto del
display, cioè la capacità di rendere più o meno scuri i pixel attivi,
per rendere migliore la visualizzazione, in funzione della luminosità
dell’ambiente, del display; di solito la regolazione si ottiene con un
potenziometro da 10k.
Il pin 4 (RS), detto Register Selector, indica la natura
dell’informazione presente sul bus dati: se viene forzato a 0 il byte
in ingresso sarà interpretato come un comando da eseguire (istruzione),
mentre con un 1 sarà ritenuto dato da interpretare.
Il pin 5 (R/W)
specifica la direzione dei bytes sul bus: se vale 0 si sta scrivendo
nella memoria interna LCD, mentre con un 1 questa memoria è sottoposta
a lettura. Il pin 6 (E) è il segnale che abilita il dispositivo:
quando è a livello alto sincronizza la lettura del dato o del comando
predisposto sul bus dati. L'Enable è il vero e proprio segnale di
sincronismo, da forzare a 1 quando il dispositivo è pronto a gestire un
dato o un comando predisposto sul bus dati (in funzione del valore del
busy flag: finché il suo valore è 1 il controller è occupato a gestire
i trasferimenti interni e non è in grado di accettare l'istruzione
successiva).
I pin dal numero 7 al numero 14 (D0-D7) rappresentano il Data Bus su
cui avviene la trasmissione o ricezione dati dal display, in base
all’operazione che si sta svolgendo.
Talvolta sono presenti 2 pin aggiuntivi (pin 15 e 16), mediante i quali
è possibile alimentare l'eventuale luce di retroilluminazione.
Risorse interne del modulo LCD
ROM del generatore di caratteri
Questa struttura si basa sulla presenza di una capace memoria CGROM
(Character Generator Read Only Memory), contenente i font dei 208
caratteri da 5x8 punti (8320 bit) e dei 32 caratteri da 5x10 punti
(1600 bit). Il codice del carattere che si desidera visualizzare,
fornito come dato al controller, consente di localizzare la matrice di
punti corrispondente all'interno di questa memoria a sola lettura, in
accordo con la seguente tabella:
|
|
Tab.2 - Codici carattere per matrice 5x8
|
RAM del generatore di caratteri
Il controller mette a disposizione 8 bytes di CGRAM (Character
Generator Random Access Memory). In queste locazioni è possibile
provvedere alla ridefinizione di caratteri da programma; i codici di
dato in grado di puntare queste nuove matrici di punti sono quelli da
00H a 0FH, evidenziati dalla prima colonna a sinistra, nella precedente
tabella.
RAM per i dati del Display
Sono disponibili 80
bytes di memoria DDRAM (Display Data Random Access Memory) sufficienti
per memorizzare altrettanti codici ad 8 bit, cioè caratteri. Il
generatore interno è in grado di localizzare il dato all'intero della
CGROM e visualizzarlo sul display in una determinata posizione.
Ciascun carattere occupa una posizione ben precisa dentro la memoria
DDRAM, indicata dal numero esadecimale del suo indirizzo; la loro
sequenza varia in funzione della dimensione del visualizzatore presente
sul modulo, o più precisamente in funzione del loro numero di linee e
del numero di caratteri per linea. Le locazioni utili per il display
utilizzato vanno da 0x80 a 0x8F per la prima riga e da 0xC0 a 0xCF per
la seconda riga.
Le locazioni di memoria non utilizzate per la visualizzazione dei
caratteri possono essere usate in modo convenzionale, come normali
locazioni RAM.
Registri a 8 bit:
I registri a 8bit sono 2: l'IR e il DR
L'IR (Instruction Register), a sola scrittura, ha il compito di
memorizzare i codici delle istruzioni di controllo della
visualizzazione, come quelle destinate alla gestione del cursore o
all'indirizzamento delle 2 RAM. Il DR (Data Register) è invece il
registro di transito delle informazioni.
Il comportamento di questi due registri varia a seconda che siamo in
modalità lettura o modalità scrittura. Nelle operazioni di scrittura
una precedente scrittura di un indirizzo in IR specifica in quale
locazione di una delle 2 RAM (CGRAM oppure DDRAM) verrà trasferito
automaticamente il dato non appena il processore scrive in DR. Nelle
operazioni di lettura una precedente scrittura di un indirizzo in IR
provvede a trasferire automaticamente il dato in DR dalla specificata
locazione di una delle 2 RAM. La lettura di DR da parte del processore
attiva anche il trasferimento interno automatico di un nuovo dato dalla
locazione di una delle 2 RAM puntata dall'indirizzo successivo, in
attesa della prossima effettiva lettura da parte della CPU.
Dei 2 Registri quello coinvolto in queste operazioni dipende dal valore
del segnale RS, che troveremo anche tra quelli presenti sul
connettore del modulo LCD. Con RS a 1 il registro coinvolto in lettura
o scrittura è DR e l'informazione scambiata è un dato per o da una
delle 2 RAM; con RS a 0 il registro coinvolto è IR, ma solo in
scrittura (del codice di una istruzione).
L'eventuale lettura da parte del processore mette a sua disposizione il
valore corrente del contatore d'indirizzo (i 7 bit meno significativi,
DB6-DB0) e quello del busy flag, cioè in sostanza dello stato del
controller (entrambe queste risorse sono descritte qui di seguito).
Il Busy Flag
Il controller LCD richiede del
tempo per eseguire le istruzioni o la scrittura di un dato, e quando
riceve qualcosa fa partire le sue routine operative internet che
richiedono tempo. Durante questo tempo il controller è occupato e non
interpreterà nient'altro di quello che gli verrà inviato. Per questo è
necessario aspettare nu po' prima di inviare nuovamente dati al modulo.
E' impossibile sapere quanto tempo occorrerà per l'esecuzione di queste
operazioni, che dipendono dal tipo di controller, dal tipo di
operazione, dalla frequenza di clock del controller.
Il controller mette allora a disposizione un bit, chiamato Busy Flag
che viene posto sulla linea D7 dopo un'istruzione di lettura. Un
livello alto su questa linea significa che il controller è ancora
occupato, un livello basso indica che il controller ha finito le
precedenti operazioni ed è pronto per ricevere altri dati.
La routine che gestirà le comunicazioni con il display dovrà anche
poter controllare questo flag, al fine di evitare errori di scrittura
sul display o errata interpretazione dei dati.
Temporizzazioni
Per interfacciare
correttamente il controller HD44780 con i processori chiamati a gestire
il visualizzatore associato è necessario conoscere con grande dettaglio
anche le temporizzazioni necessarie al componente per interpretare ed
eseguire le sue istruzioni.
Le 2 figure seguenti mostrano in dettaglio i diagrammi temporali
relativi alle fasi di scrittura verso il controller e di lettura dal
controller. Il tempo minimo previsto per un intero ciclo di lettura o
scrittura (Tc) è di 1 ms, tutti i tempi di transizione (fronti di salita e di discesa) sono da ritenere dell'ordine di 25 ns al massimo.
Ciclo di scrittura
Il ciclo di scrittura permette di scrivere dei dati all'interno di
locazioni della RAM del controller, o all'interno di uno dei suoi
registri; inoltre il ciclo di scrittura viene anche usato per
l'esecuzione di tutti i comandi che il controller può interpretare
La fase di scrittura verso il controller HD44780 è la più ricorrente. Il ciclo di scrittura si compone delle seguenti fasi:
-
si pone il codice operativo di una istruzione per il controller o il
codice del carattere da scrivere deve sul bus dati. Nel primo caso
(istruzione) il segnale RS deve essere posto a 0; nel secondo (dato)
deve essere forzato a 1;
- il segnale R/W deve essere messo a 0;
-
i segnali RS e R/W
devono essere posti (pressocchè simultaneamente) almeno 60 ns prima di
portare alto il segnale di abilitazione E; questo tempo minimo è
definito Tas.
- il segnale E è ancora a 0; bisogna attendere almeno
60 ns prima di portarlo a 1. Dopo questo tempo l'impulso di
abilitazione E deve rimanere a 1 almeno per 450 ns (Tw), per lasciare
al visualizzatore il tempo necessario per interpretare (o fornire) il
dato; al termine è necessario riportare l'impulso a 0: il valore
presente sul bus dati viene scritto sul fronte di discesa di E (si da
per scontato che esso sia presente sul bus almeno 195 ns prima che E
torni a 0);
- il dato deve essere mantenerlo sul bus almeno altri
10 ns (cioè per Th) dopo che il segnale E è tornato basso. Non appena
il segnale di abilitazione E viene riportato a 0 devono passare almeno
20 ns prima di rilasciare i segnali RS e R/W; questo tempo minimo è definito Tah.
La fig.1 mostra le temporizzazioni descritte qua sopra con inserite le nomenclature dei vari tempi:
|
|
Fig.1 - Temporizzazioni per la scrittura
|
Ciclo di lettura
Il controller HD44780 permette anche di leggere le locazioni di memoria
della CGRAM e della DDRAM per poter risalire ai dati scritti
all'interno del display. Come gia detto l'HD44780 dispone di 80 celle
di memoria DDRAM, nn tutte utili per la visualizzazione. E' pertanto
possibile utilizzare le celle non di visualizzazione per altri scopi,
come la memorizzazione temporanea di dati.
La fase di lettura dal controller HD44780, intesa come assunzione dei
dati contenuti in una delle 2 memorie CGRAM e DDRAM, è poco probabile;
essenziale è, invece, la necessità di leggere lo stato del componente,
cioè il bit7 del dato assunto con segnale RS a 0 gia citato in
precedenza, che deve essere letto in polling per stabilire il momento
giusto per fornire il comando successivo (quando il bit vale 0).
In dettaglio il ciclo di lettura si compone delle seguenti fasi:
-
per leggere lo stato del controller (flag di busy e valore corrente del
contatore d'indirizzo) il segnale RS deve essere posto a 0; per leggere
i valori dalle 2 memorie (dati) deve essere posto a 1;
- il segnale R/W è posto a 1;
-
i segnali RS e R/W devono essere posti (pressocchè simultaneamente) almeno 60 ns prima di portare alto il segnale di abilitazione E;
-
il segnale E è ancora a 0; bisogna attendere almeno 60 ns prima di
portarlo a 1. Non appena E è a 1 il controller metterà il dato sul bus
in un tempo massimo di 360 ns;
- dopo che l'impulso E dell'abilitazione è passato a
1 è necessario attendere almeno altri 450 ns prima di riportarlo a 0:
il valore presente sul bus dati sarà letto sul fronte di discesa di E;
- il controller mantiene il dato sul bus per almeno
altri 5 ns (cioè per Th) dopo che il segnale E è tornato basso. Non
appena il segnale di abilitazione E viene riportato a 0 devono passare
almeno 20 ns prima di rilasciare i segnali RS e R/W.
|
|
Fig.2 - Temporizzazioni per la lettura
|
Utilizzando un PIC cloccato a 4MHz si ottiene una frequenza di lavoro
interna pari ad 1MHz. Da questo si ricava che il PIC, per eseguire una
singola istruzione, impiega un tempo minimo pari ad 1µs. I tempi di
mantenimento e attesa descritti qui sopra sono quindi sempre e
largamente mantenuti. La nostra routine di gestione del display non
dovrà quindi preoccuparsi di queste temporizzazioni.
Il set di istruzioni
Il componente HD44780 è
nato per costituire un'interfaccia con qualunque microprocessore o
controllore di processo in grado di fornire i 2 segnali R/W e RS che
regolano il traffico d'informazioni del suo bus dati a 8bit. Anche una
porta parallela può simulare con estrema facilità questa gestione.
Naturalmente diventa importante imparare le istruzioni che consentono
il controllo alla CPU esterna; alcune istruzioni sono dedicate al
controllo del visualizzatore, altre alla gestione dei dati sulle 2 RAM.
Le istruzioni (bytes di comando) necessarie per controllare il display sono raccolte nella tabella seguente:
| Istruzione |
Input |
Data Bus |
Descrizione |
Tempo MAX |
| RS |
R/W |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
| NOP |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Nessuna operazione |
0s |
| Cancella display |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Cancella il visualizzatore e fa tornare il cursore alla posizione 0. |
1,64ms |
| Cursore a capo |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
Riporta il cursore alla posizione 0. |
1,64ms |
| Modo d'accesso dei caratteri |
0 |
0 |
0 |
0 |
0 |
1 |
I |
S |
Imposta la direzione del movimento del cursore (I/D) e specifica se muovere il display (S). Queste operazioni sono
fatte durante la lettura/scrittura dati.
|
40µs |
| Controllo Display |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
Imposta il display On/Off (D), il cursore On/Off (C) e il lampeggio del cursore (B). |
40µs |
| Scorrimento cursore e display |
0 |
0 |
0 |
1 |
S/C |
R/L |
- |
- |
Imposta il movimento del cursore o lo spostamento del display (S/C) e
la direzione del movimento. Il contenuto della DDRAM rimane invariato. |
40µs |
| Impostazioni Funzioni |
0 |
0 |
1 |
DL |
N |
F |
- |
- |
Imposta la lunghezza dei dati dell'interfaccia (DL), il numero di linee del display (N) e il font del carattere (F). |
40µs |
| Indirizzo CGRAM |
0 |
1 |
CGRAM Address |
Imposta l'indirizzo della CGRAM. Il dato CGRAM deve essere inviato o ricevuto dopo questa impostazione. |
40µs |
| Indirizzo DDRAM |
1 |
DDRAM Address |
Imposta l'indirizzo della DDRAM. Il dato CGRAM deve essere inviato o ricevuto dopo questa impostazione. |
40µs |
| Lettura Bit di Stato/Indirizzo |
1 |
BF |
Address Counter |
Legge Busy Flag e l'Address Counter |
0s |
| Scrittura dato |
1 |
0 |
Dato da scrivere |
Scrive un dato nella CGRAM o nella DDRAM |
40µs |
| Lettura dato |
1 |
Dato da leggere |
Legge un dato dalla CGRAM o dalla DDRAM |
40µs |
|
|
Tab.3 - Set di istruzioni del controller HD44780
|
Nella tabella che segue sono descritti i bit di configurazione da utilizzare nei comandi elencati sopra:
| Nome del bit |
Settaggio/Stato |
| 0 |
1 |
| I/D |
Decrementa la posizione del cursore |
Incrementa la posizione del cursore |
| S |
Spostamento del display |
Nessun spostamento del display |
| D |
Display Off |
Display On |
| C |
Cursore Off |
Cursore On |
| B |
Lampeggio cursore Off |
Lampeggio cursore On |
| S/C |
Muovi cursore |
Sposta display |
| R/L |
Sposta a sinistra |
Sposta a destra |
| DL |
Interfaccia a 4bit |
Interfaccia a 8bit |
| N |
Una linea |
Due linee |
| F |
Carattere di 5x7 punti |
Carattere di 5x10 punti |
| BF |
Comando eseguito |
Comando in esecuzione |
|
|
Tab.4 - Bit di configurazione
|
Descrizione comandi
(0x00) - NOP
Nessuna operazione, classica istruzione che non produce alcun effetto.
(0x01) - Clear Display
Scrive il codice 20H (cioè il carattere "spazio") in tutte le locazioni
DDRAM ed azzera il Contatore d'indirizzo AC, riportando il
visualizzatore nelle condizioni originali; il cursore lampeggia
nell'angolo in alto a sinistra (primo carattere della prima riga); in
pratica esegue lo stesso servizio che la procedura ClearScreen (Pascal)
impone al nostro monitor.
(0x02-0x03) - Cursore a capo
Forza a 0 il contatore d'indirizzo AC, senza cambiare il contenuto
della DDRAM; il cursore lampeggia nell'angolo in alto a sinistra (primo
carattere della prima riga); si comporta come il cursore del nostro
monitor quando si preme il tasto Home.
(0x04-0x07) - Modo di accesso dei caratteri
Specifica la direzione verso la quale si sposterà il cursore (se i
caratteri sono mantenuti al loro posto) o i caratteri visualizzati (se
è il cursore che rimane fisso); in sostanza stabilisce se le 2 memorie
DDRAM o CGRAM saranno lette o scritte in locazioni con indirizzo
crescente o decrescente, (cioè incrementando o decrementando
l'indirizzo contenuto in AC); naturalmente qualora l'istruzione sia
riferita alla CGRAM l'eventuale effetto di shift sul display non viene
imposto.
Bit I = 0; bit S = 0: si scrive in locazioni con indirizzo decrescente
(cioè AC viene decrementato); il cursore si muove verso sinistra, cioè
il testo creato rimane fisso: l'effetto è quello di una frase che si
sviluppa alla rovescia all'indietro, estratta dal cursore, a partire
dalla sua posizione iniziale.
Bit I = 0; bit S = 1: si scrive in locazioni con indirizzo decrescente
(cioè AC viene decrementato); il cursore è mantenuto fisso, cioè il
testo creato si muove verso destra: l'effetto è quello di una frase che
si sviluppa alla rovescia in avanti, estratta dalla posizione iniziale
del cursore.
Bit I = 1; bit S = 0: si scrive in locazioni con indirizzo crescente
(cioè AC viene incrementato); il cursore si muove verso destra (cioè il
display è fisso): l'effetto è quello di una frase che si sviluppa
diritta in avanti, estratta dal cursore, a partire dalla sua posizione
iniziale.
Bit I = 1; bit S = 1: si scrive in locazioni con indirizzo crescente
(cioè AC viene incrementato); il cursore è mantenuto fisso, cioè il
testo creato si muove verso sinistra: l'effetto è quello di una frase
che si sviluppa diritta indietro, estratta dalla posizione iniziale del
cursore.
(0x08 - 0x0F) - Controllo display
Questo comando permette di effettuare tre operazioni sul display. La
prima operazione consiste nel decidere se il cursore deve essere
visibile o invisibile: quando è visibile il cursore ha la forma di un
trattino (underscore) di 5 pixel sulla linea più bassa; quando non è
visibile i caratteri sul display rimangono congelati, anche se nel
frattempo sono state eseguite operazioni di scrittura o lettura. La
seconda funzione permette l'attivazione o meno dell'effetto lampeggio
(blinking) sul carattere puntato dal cursore, alternando alla sua
consueta matrice di punti quella composta da pixel tutti spenti. La
terza operazione consenti accendere o spegnere tutti i pixel del
display: pur mantenendo i dati in memoria DDRAM, i caratteri
corrispondenti non vengono visualizzati; quando il display è spento
ogni controllo sul cursore può ancora essere esercitato (cursore
visibile/invisibile, con o senza effetto blink) ma risulta ovviamente
inutile: per questo per spegnere il display può essere utilizzato
indifferentemente uno dei 4 codici operativi corrispondenti.
(0x10 - 0x1F) Scorrimento Cursore/Testo
Impone lo spostamento di tutti i caratteri visualizzati o del solo
cursore, verso destra o verso sinistra, senza intervenire sul contenuto
delle locazioni DDRAM (come invece imponeva il modo d'accesso dei
caratteri visto in precedenza, legato alla effettiva scrittura o
lettura). Il servizio torna utile quando si deve intervenire sui
caratteri già scritti, per effettuare una correzione, o semplicemente
per cercare un determinato carattere; ovviamente il cursore passa
automaticamente da una linea all'altra e lo scorrimento è imposto
simultaneamente su tutti i caratteri di entrambe le linee. Lo
spostamento a sinistra (a destra) del cursore decrementa (incrementa)
il registro d'indirizzo AC. Lo spostamento a sinistra (a destra) del
display da la sensazione che il cursore si muova dalla parte opposta, a
destra (sinistra); lo spostamento del display non comporta modifiche di
AC.
I 2 bit meno significativi del comando non sono coinvolti nella definizione delle istruzioni.
(0x20 - 0x3F) - Impostazioni funzioni
Predispone il componente per garantire l'interfaccia desiderata
dall'utente. In sostanza è possibile scegliere il numero di linee
coinvolte sul bus dati, di solito DB7-DB0 con 8bit di dati o DB7-DB4
con 4bit di dati; è possibile scegliere il numero di linee del display
coinvolte nella visualizzazione (se il display ne prevede più di una) e
la quantità di pixel utilizzata per le matrici del carattere. E'
possibile utilizzare caratteri da 5x7 pixel o 5x10 pixel. Anche in
questo caso 2 bit meno significativi del comando non sono coinvolti
nella definizione delle istruzioni.
(0x40 - 0x7F) - Indirizzo CGRAM
Le locazioni della CGRAM (memoria del Generatore di Caratteri) sono 64, per cui sono necessari 6bit (26=64)
bit per la selezione dell'indirizzo: poichè le istruzioni sono a 8 bit,
questa istruzione si compone anteponendo al valore binario 01 (bit7,
bit6, più significativi) quello dell'indirizzo, da 00000 a 111111
(bit5-bit0, meno significativi). L'effettivo dato sarà scritto o letto
solo dopo aver eseguito una di queste istruzioni. (0x80 - 0xFF) - Indirizzo DDRAM Le locazioni della DDRAM
(memoria dati del display) sono 80, per cui i codici operativi
necessari richiedono l'utilizzo di almeno 7 bit (27=128).
Dato che con 7 bit è possibile esprimere locazioni fino alla numero 128
è chiaro che non tutte le combinazioni sono necessarie: i 7 bit
d'indirizzo dovranno esprimere solo i numeri da 0 (0b0000000) a 79
(0b1001111); per formattare a 8 bit il corrispondente codice operativo,
ai 7 bit dell'indirizzo si antepone un bit a 1 (bit7, il più
significativo). E' comunque chiaro che il controller HD44780 è in
grado di immagazzinare più caratteri di quanti il visualizzatore possa
mostrare. Per esempio, quelli ad una linea gestiscono fino a 40
caratteri, per cui solo una metà (da 0 a 39, da 00h a 27H) delle
locazioni è copiata sul display; la rimanente metà può però essere
fatta scorrere nelle medesime 40 posizioni del visualizzatore, con le
istruzioni descritte in precedenza.
Per il mio visualizzatore a 2 linee (N=1) gli indirizzi di memoria
corrispondeti alla prima riga vanno da 0x00 a 0x27, mentre per la
seconda riga vanno da 0x40 a 0x67 Fasi iniziali della programmazione
La prima fase di ogni programma deve provvedere all'inizializzazione del componente per permetterne un corretto utilizzo.
All'accensione del display il Busy Flag è mantenuto a 1 fino alla fine
della fase di inizializzazione; la memoria DDRAM viene riempita di
spazi (come l'opcode 0x01); l'interfaccia viene predisposta per 8 bit
di dati (DL=1), per visualizzatore ad 1 linea (N=0) e per matrice del
carattere con 5x7 pixel (F=0) (come l'opcode 0x30); il visualizzatore
viene spento (D=0) e il cursore reso invisibile (C=0) e a forma di
trattino (B=0) (come l'opcode 0x08); il modo d'accesso dei caratteri
prevede l'autoincremento dell'indirizzo (I=0) con display bloccato
(S=0) (come l'opcode 0x04).
Di solito queste condizioni iniziali sono imposte da hardware nel
momento dell'accensione o in seguito all'attivazione del segnale reset;
va per altro sottolineato che il costruttore specifica chiaramente che
per garantire l'inizializzazione da HW il tempo concesso
all'alimentazione per raggiungere i 4,5V (power supply rise time) è al
massimo di 10 ms.
Il costruttore del display raccomanda di utilizzare sempre una determinata sequenza di comandi subito dopo l'accensione:
- attendere per un periodo iniziale di almeno 15ms (con alimentazione a 5V) o di almeno 40ms (con alimentazione a 2,7V);
-
inviare il comando per la predisposizione di un'interfaccia a 8bit o a
4bit senza curarsi della forma del visualizzatore e della matrice del
carattere; il codice operativo può essere dunque ambiguo su tutti i
4bit meno significativi, cioè sarà del tipo 0011xxxx;
l'imposizione di un ulteriore ritardo di 4,1ms;
- la ripetizione della predispone per l'interfaccia, ancora in modo ambiguo su tutti i 4bit meno significativi;
- un ulteriore ritardo di 100 microsecondi;
- per la terza volta la medesima predisposizione ambigua dell'interfaccia.
Dopo queste 3 istruzioni di sincronizzazione (durante le quali R/W=0 e
RS=0 e non è ammesso verificare il Busy Flag) sono fornite in sequenza
quelle che impostano il controller per le nostre effettive esigenze;
dopo ciascuna di esse è ammessa ora la verifica del Busy Flag.
Una prova pratica ha dimostrato che le sequenze di ritardo consigliate
dal costruttore e la necessità di ribadire 3 volte la predisposizione
ambigua di un'interfaccia a 8 bit con il codice operativo 30H non è
strettamente necessaria. Della sequenza di inizializzazione descritta
poco fa, per sincronizzare il componente è stato sufficiente eseguire
un solo OUT del valore 30H. Naturalmente, essendo operazioni una-tantum
vale la pena comunque seguirle alla lettera. Ad esse faranno seguito i
comandi per la gestione con interfaccia a 6bit o interfaccia a 4 bit.
|